﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class LoginForm : Form
    {
        private Control control;

        public LoginForm()
        {
            // Initialize graphic form
            InitializeComponent();

            control = Control.getInstance(this);

            // Attempt to connect to database
            control.OpenDatabaseConnection();
        }

        private void OpenUserPanel(UserInfo userInfo)
        {
            this.TB_Password.Clear();

            switch (userInfo.GetUserType())
            {
                case eUserTypes.USER_RECEPTION:
                    new PersonnelMainForm(userInfo, this);
                    this.Close();
                    break;
                case eUserTypes.USER_DOCTOR:
                    //new DoctorMainForm(userInfo);
                    PersonnelMainForm panel = new PersonnelMainForm(userInfo, this);
                    control.SwitchWindow(this, panel);
                    //panel.Show();
                    //this.Hide();
                    break;
                case eUserTypes.USER_ADMINISTRATOR:
                    // TODO: Admin Panel
                    // break;
                case eUserTypes.USER_NOPRIVILEDGES:
                default:
                    MessageBox.Show("Przepraszamy, ten typ użytkownika nie ma jeszcze\nzdefiniowanego zachowania.");
                    break;
            }
        }

        // The login process logic.
        // TODO: Nie wiem, czy Microsoftowe struktury ODBC sprawdzają rzeczy w stylu mysql escape string,
        //       więc możliwe ze trzeba się pozbyć ryzyka SQL injection tutaj
        // TODO: Przechodzenie do odpowiedniego panelu w zalezności od typu użytkownika
        private void BT_Login_Click(object sender, EventArgs e)
        {
            String login = this.TB_Login.Text;
            String pwd = this.TB_Password.Text;

            if (login.Equals(""))
            {
                MessageBox.Show("Proszę podać nazwę użytkownika.", "Niewystarczające dane logowania", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (pwd.Equals(""))
            {
                MessageBox.Show("Proszę podać hasło.", "Niewystarczające dane logowania", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (control.IsDBConnectionOpen())
            {
                try
                {
                    String connStr = "SELECT id, username, password_md5, usertype FROM medapp.login WHERE username = '" + DBConnection.MySqlEscape(login) + "' AND password_md5 = MD5('" + DBConnection.MySqlEscape(pwd) + "');";
                    System.Data.Odbc.OdbcDataReader m_ODBCResult = control.ExecuteQuery(connStr);

                    if (!m_ODBCResult.Read())
                    {
                        MessageBox.Show("Podane hasło jest niepoprawne,\nlub nie istnieje użytkownik o takim identyfikatorze.", "Niewłaściwe dane logowania", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    int userID = m_ODBCResult.GetInt32(0);
                    int userType = m_ODBCResult.GetInt32(3);

                    connStr = "SELECT first_name, last_name, PESEL FROM medapp.staff WHERE id = " + userID + ";";
                    m_ODBCResult = control.ExecuteQuery(connStr);

                    m_ODBCResult.Read();

                    // It is assumed database data is correct,
                    // and a 1:1 relationship between tables `login` and `staff` exists on key `id`
                    UserInfo uInfo = new UserInfo(userID, userType, m_ODBCResult.GetString(0), m_ODBCResult.GetString(1), m_ODBCResult.GetInt64(2));

                    OpenUserPanel(uInfo);
                }
                catch (System.Data.Odbc.OdbcException Ex)
                {
                    MessageBox.Show("Logowanie nie powiodło się.\n\nPowód:\n" + Ex.Message, "Błąd w połączeniu z bazą danych", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("Nie można było dokonać logowania,\nponieważ połączenie z bazą danych wygasło.", "Błąd w połączeniu z bazą danych", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // Attempts to reconnect to database using pre-defined connection settings.
        private void BT_DBReconnect_Click(object sender, EventArgs e)
        {
            if (!control.IsDBConnectionOpen())
                control.OpenDatabaseConnection();
        }
    }
}
